//
//  HMComposeView.swift
//  新浪微博
//
//  Created by 饶鹏伟 on 16/4/16.
//  Copyright © 2016年 饶鹏伟. All rights reserved.
//

//自定义的撰写控制器的根视图

import UIKit
import SnapKit

class HMComposeView: UIView {

    //记录一下这个视图的父控制器
    var target: UIViewController?
    
    //供外界调用 把控制器传过来 把这个视图 加到传过来的控制器上面
    func show(target: UIViewController){
        
        self.target = target
        
        target.view.addSubview(self)
        
    }
    
    
     override init(frame: CGRect) {
        // 初始化设置视图的大小
        let rect=UIScreen.mainScreen().bounds
        
        super.init(frame: rect)
        
        //设置视图上的显示界面
        setupUI()
        
        //self.backgroundColor=UIColor.redColor()
    }

     required init?(coder aDecoder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
    

    
    func setupUI(){
        
        backgroundColor=randomColor()
        //在视图上添加毛玻璃效果的子视图
        addSubview(backImageView)
        //添加背景标题图
        addSubview(sloganView)
        
        //设置毛玻璃约束
        backImageView.snp_makeConstraints { (make) -> Void in
            
            make.edges.equalTo(self.snp_edges)
            
        }
        
        //设置背景标题约束
        sloganView.snp_makeConstraints { (make) -> Void in
            
            
            make.centerX.equalTo(self.snp_centerX)
            make.top.equalTo(self.snp_top).offset(100)
        }
        
        
        //添加按钮
        addChildButtons()
        
        
    }
    
    
    //添加六个按钮
    private func addChildButtons(){
        //有几个按钮
        let count=composeInfos.count
        
        //按钮的宽高
        let bW: CGFloat=80
        let bH: CGFloat=110
        let margin: CGFloat=(ScreenWidth-3*bW)/4
        let rect=CGRect(x: 0, y: 0, width: bW, height: bH)
        
        //添加按钮
        for i in 0..<count{
            
          let item=composeInfos[i]
          let button=HMComposeButton()
           // button.backgroundColor=randomColor()
            
          //赋值
            button.composeItem=item
           //给按钮添加点击事jian
           button.addTarget(self, action: "buttonDidClick:", forControlEvents: .TouchUpInside)
            
           //设置按钮颜色和剧中 添加按钮到视图
            button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
            button.titleLabel?.textAlignment = .Center
            addSubview(button)
            
            //修改每个按钮的位置
            let offsetX = (bW + margin) * CGFloat(i%3) + margin
            let offsetY = (bH + margin) * CGFloat(i/3) + ScreenHeight
            button.frame = CGRectOffset(rect, offsetX, offsetY)
            
            //把按钮添加到数组中
            buttonArray.append(button)

        }
    }
    
 
  //按钮的点击事件
   @objc private func buttonDidClick(button: HMComposeButton){
        
   //执行动画效果 被点击的按钮 执行放大的动画  其他按钮执行缩小的动画
    
    for btn in buttonArray{
        
        var scale: CGFloat=0
        if btn==button{
            
            scale=2.0
            
        }else{
            
            scale=0.1
        }
        
        //执行动画东效果
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            //设置alpha
            btn.alpha = 0
            btn.transform  = CGAffineTransformMakeScale(scale, scale)
            }, completion: { (_) -> Void in
                print("OK")
        })
        
    }
    
    
    //执行页面跳转
    //获取按钮对应的模型
    
    guard let className=button.composeItem?.target else{
        
        print("className 为空")
        return
    }
    
    //需要记忆
    //根据字符串获取对应的类型控制器

    let classType = NSClassFromString(className) as! UIViewController.Type
    let vc = classType.init()
    let nav = UINavigationController(rootViewController: vc)
    target?.presentViewController(nav, animated: true, completion: { () -> Void in
        self.removeFromSuperview()
    })

    

  }
    
    //点击屏幕的方法 让按钮从最后一个依次消失
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        //执行动画  依次获取每个按钮 给按钮执行动画 reverse()反转的意思 先取最后一个按钮
        for (index,button) in buttonArray.reverse().enumerate() {
            
            
            animationWith(button, index: index, isUp: false)
            
        }
        
    }
    
    
   //这个视图将要移动到父视图上 让按钮从第一个 依次出现
    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)

       //print(newSuperview)
        
       //执行动画  依次获取每个按钮 给按钮执行动画
        for (index,button) in buttonArray.enumerate(){
            
            
           animationWith(button, index: index, isUp: true)
            
            
        }
        
    }
    
    
    //执行动画的方法 封装的
    private func animationWith(button: HMComposeButton, index: Int, isUp: Bool = false){
        
        UIView.animateWithDuration(0.8, delay: Double(index) * 0.03, usingSpringWithDamping: 0.6, initialSpringVelocity: 5, options: [], animations: { () -> Void in
            
            
            //修改按钮的中心点
            button.center=CGPoint(x: button.center.x, y: button.center.y + (isUp ? -350 : 350))
            
            }) { (_) -> Void in
                
                //完成上面的动画 执行的效果
                if !isUp {
                    //向下的效果 移除这个视图
                    self.removeFromSuperview()
                }
        }
    }
    
    
  
  //懒加载子视图
  //磨砂效果的背景视图 第三方框架实现的磨砂效果
    private lazy var backImageView: UIImageView=UIImageView(image: UIImage.snapshotScreen().applyLightEffect())
    
  //背景标题图
    private lazy var sloganView: UIImageView=UIImageView(image: UIImage(named: "compose_slogan"))
    
 //保存按钮的数组
    private lazy var buttonArray: [HMComposeButton]=[HMComposeButton]()
    
 //储存按钮信息的数组
    private lazy var composeInfos: [HMComposeItem]={
        
       //从文件中读取数组
        let path=NSBundle.mainBundle().pathForResource("Compose.plist", ofType: nil)!
        
      //获取数组
        let array=NSArray(contentsOfFile: path) as! [[String : String]]
        
      //遍历数组字典转模型
        
        //定义一个数组来储存模型
        var itemArray = [HMComposeItem]()
        
        for item in array{
            
            let composeItem = HMComposeItem(dict: item)
            itemArray.append(composeItem)
            
        }
        
        return itemArray
    }()
    
    
}
